<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="root">
        <app></app>
    </div>
</body>
<script>

    // 定义一个school组件
    const school = Vue.extend({
        data() {
            return {
                name: '东软',
                address: '东软大道'
            }
        },
        template: `<div>
            <h1>名字是{{name}}</h1>
            <h1>地址是{{address}}</h1>
            </div>`
    })
        console.log(school)
        // 打印出来，我们可以看到组件的本质就是一个构造函数，是Vue.extend生成的，vue解析页面解析到组件标签的时候会帮我们创建组件的实例对象
        // 即Vue帮我们执行new VueComponent(options)   这里options是组件配置项
        // 每次调用Vue.extend的时候返回的都是一个全新的VueComponent!!!重要的结论
    // 定义app组件


    // extend函数里面有这样一点代码，代表最后返回VueComponent，但是每个组件返回的都是不一样的VueComponent，都是全新的
    // var Sub = function VueComponent (options) {
    //     this._init(options);
    //   };
    //   return Sub
    // 组件其实就是一个VueComponent构造函数，你用组件保存起来了

    // 关于this的指向
    // 在new Vue(options)配置中data的函数，methods中的函数，watch中的函数，computed中的函数，他们的this都是指向Vue实例对象
    // 组件配置中，data的函数，methods中的函数，watch中的函数，computed中的函数，他们的this都是指向VueComponent(由于组件接收了VueComponent，也可以说是组件实例对象)实例对象，因为构造函数this指向它的实例对象
    // 组件实例对象，也就是VueComponent简称vc，Vue实例对象简称vm
    const app = {
        components:{
            school
        },
        template:`<div>
            <school></school>
            </div>`
    }
    Vue.config.productionTip = false;
    const vm = new Vue({
        el: '#root',
        data: {

        },
        components:{
            app
        }
    })
    // 这里有一个非常重要的内置关系VueComponent.prototype.__proto__ === Vue.prototype
    // 这样的目的是让组件实例对象也能使用Vue原型上的属性和方法
    // 这里打印出来是true
    console.log(school.prototype.__proto__ === Vue.prototype)

    // 这个是false
    console.log(school.prototype === Vue)
    
</script>

</html>